UDP (User Datagram Protocol) একটি connectionless প্রোটোকল যা ডেটা প্যাকেট (ডাটাগ্রাম) পাঠানোর জন্য ব্যবহৃত হয়। UDP নির্ভরযোগ্যতার জন্য TCP-এর মতো handshake প্রক্রিয়া অনুসরণ করে না এবং কোনো ডেটা অর্ডারিং বা error correction সেবা প্রদান করে না। এটি দ্রুত ডেটা ট্রান্সমিশনের জন্য ব্যবহৃত হয় এবং TCP-এর তুলনায় অপেক্ষাকৃত কম জটিল। UDP সাধারণত রিয়েল-টাইম অ্যাপ্লিকেশন (যেমন VoIP, ভিডিও স্ট্রিমিং, অনলাইন গেমিং) এবং কম্পিউটার নেটওয়ার্ক প্রটোকল (যেমন DNS, DHCP) এর জন্য উপযোগী।
Connectionless:
Unreliable:
No Error Recovery:
Faster Transmission:
UDP Socket Programming-এর জন্য কয়েকটি গুরুত্বপূর্ণ System Call রয়েছে:
socket():
int socket(int domain, int type, int protocol);
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bind() (সার্ভারের ক্ষেত্রে):
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
sendto():
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
recvfrom():
Syntax:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
close():
int close(int sockfd);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
char *message = "Hello from server";
// 1. Socket তৈরি করা
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 2. সার্ভার ঠিকানা সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// 3. Binding করা
if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
printf("Server is listening on port %d\n", PORT);
// 4. ডেটা গ্রহণ করা
int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&client_addr, &addr_len);
buffer[n] = '\0';
printf("Client: %s\n", buffer);
// 5. ডেটা পাঠানো
sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&client_addr, addr_len);
printf("Hello message sent to client\n");
// 6. Socket বন্ধ করা
close(sockfd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sockfd;
char buffer[1024];
struct sockaddr_in serv_addr;
socklen_t addr_len = sizeof(serv_addr);
char *message = "Hello from client";
// 1. Socket তৈরি করা
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 2. সার্ভার ঠিকানা সেটআপ করা
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 3. ডেটা পাঠানো
sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&serv_addr, addr_len);
printf("Message sent to server\n");
// 4. ডেটা গ্রহণ করা
int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&serv_addr, &addr_len);
buffer[n] = '\0';
printf("Server: %s\n", buffer);
// 5. Socket বন্ধ করা
close(sockfd);
return 0;
}
socket()
ফাংশন ব্যবহার করে সার্ভারের জন্য একটি UDP Socket তৈরি করা হয়।bind()
ফাংশন ব্যবহার করে Socket-কে নির্দিষ্ট IP Address এবং পোর্টে সংযুক্ত করা হয়।recvfrom()
ফাংশন ব্যবহার করে ইনকামিং ডেটা প্যাকেট গ্রহণ করা হয়।sendto()
ফাংশন ব্যবহার করে ক্লায়েন্টে ডেটা প্যাকেট পাঠানো হয়।close()
ফাংশন ব্যবহার করে Socket বন্ধ করা হয়।socket()
ফাংশন ব্যবহার করে ক্লায়েন্টের জন্য একটি UDP Socket তৈরি করা হয়।inet_addr()
ফাংশন সার্ভারের IP Address সেট করে।sendto()
ফাংশন ব্যবহার করে সার্ভারে ডেটা পাঠানো হয়।recvfrom()
ফাংশন ব্যবহার করে সার্ভার থেকে ডেটা প্যাকেট গ্রহণ করা হয়।close()
ফাংশন ব্যবহার করে Socket বন্ধ করা হয়।
UDP (User Datagram Protocol) হলো ইন্টারনেট প্রোটোকল স্যুটের একটি মূল প্রোটোকল, যা দ্রুত ডেটা ট্রান্সমিশনের জন্য ব্যবহৃত হয়। এটি TCP-এর মতো connection-oriented প্রোটোকল নয়, বরং এটি একটি connectionless প্রোটোকল, যার মাধ্যমে ডেটা ট্রান্সফার করার জন্য কোনো স্থায়ী সংযোগের প্রয়োজন হয় না। UDP সাধারণত রিয়েল-টাইম অ্যাপ্লিকেশনগুলোর জন্য ব্যবহৃত হয় যেখানে দ্রুত ডেটা পাঠানো জরুরি, যেমন ভিডিও স্ট্রিমিং, অনলাইন গেমিং, এবং ভয়েস ওভার আইপি (VoIP)।
Connectionless Protocol:
Unreliable Data Transfer:
No Error Recovery:
Faster Transmission:
No Congestion Control:
Datagram-Based:
UDP হেডার খুবই সরল এবং ছোট, যা মাত্র ৮-বাইটের হয়। এতে চারটি ফিল্ড থাকে:
UDP সাধারণত নিম্নলিখিত অ্যাপ্লিকেশন এবং পরিষেবাগুলোতে ব্যবহৃত হয়, যেখানে দ্রুততা এবং কম লেটেন্সি গুরুত্বপূর্ণ:
বৈশিষ্ট্য | UDP (User Datagram Protocol) | TCP (Transmission Control Protocol) |
---|---|---|
প্রোটোকল ধরণ | Connectionless | Connection-oriented |
নির্ভরযোগ্যতা | Unreliable (ত্রুটি পুনরুদ্ধার নেই) | Reliable (ত্রুটি পুনরুদ্ধার আছে) |
অর্ডার মেইনটেন | সঠিক ক্রম নিশ্চিত করা হয় না | সঠিক ক্রম নিশ্চিত করা হয় |
ফ্লো কন্ট্রোল | নেই | আছে |
স্পিড | দ্রুত (কম ওভারহেড) | তুলনামূলক ধীর (Handshaking ও কনজেশন কন্ট্রোলের জন্য) |
উদাহরণ | VoIP, DNS, ভিডিও স্ট্রিমিং, গেমিং | HTTP, FTP, SMTP, SSH |
UDP (User Datagram Protocol) হলো একটি Non-Connection-Oriented বা Connectionless প্রোটোকল, যার মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা ট্রান্সমিশনের জন্য কোনো স্থায়ী সংযোগের প্রয়োজন হয় না। এটি TCP-এর মতো handshake প্রক্রিয়া অনুসরণ না করে সরাসরি ডেটা প্যাকেট (ডাটাগ্রাম) পাঠায়। এই Connectionless বৈশিষ্ট্যের ফলে UDP দ্রুত ডেটা ট্রান্সফার করতে সক্ষম এবং রিয়েল-টাইম অ্যাপ্লিকেশনগুলোতে বিশেষভাবে উপযোগী।
UDP প্রোটোকল কাজ করার সময় কিছু গুরুত্বপূর্ণ বৈশিষ্ট্য থাকে যা এটিকে TCP-এর চেয়ে ভিন্ন করে:
UDP-এর Non-Connection-Oriented প্রোটোকল হওয়ার ফলে বেশ কিছু সুবিধা রয়েছে:
যদিও UDP-এর Non-Connection-Oriented প্রোটোকল দ্রুত ডেটা ট্রান্সমিশনের সুবিধা দেয়, তবুও এর কিছু সীমাবদ্ধতা রয়েছে:
UDP সাধারণত নিম্নলিখিত অ্যাপ্লিকেশন এবং পরিষেবায় ব্যবহৃত হয় যেখানে দ্রুততা বেশি গুরুত্বপূর্ণ এবং নির্ভরযোগ্যতা অপেক্ষাকৃত কম গুরুত্বপূর্ণ:
UDP Server এবং Client প্রোগ্রামের মাধ্যমে আমরা দেখবো কীভাবে UDP ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা পাঠানো যায়। UDP একটি কানেকশনলেস প্রোটোকল হওয়ায় এটি দ্রুত ডেটা ট্রান্সমিশনের জন্য ব্যবহৃত হয়। নিচে UDP Server এবং Client-এর উদাহরণ C ভাষায় দেওয়া হলো।
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
char *message = "Hello from server";
// 1. Socket তৈরি করা
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 2. সার্ভার ঠিকানা সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// 3. Binding করা
if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(sockfd);
exit(EXIT_FAILURE);
}
printf("Server is listening on port %d\n", PORT);
// 4. ডেটা গ্রহণ করা
int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&client_addr, &addr_len);
buffer[n] = '\0';
printf("Client: %s\n", buffer);
// 5. ডেটা পাঠানো
sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&client_addr, addr_len);
printf("Hello message sent to client\n");
// 6. Socket বন্ধ করা
close(sockfd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sockfd;
char buffer[1024];
struct sockaddr_in serv_addr;
socklen_t addr_len = sizeof(serv_addr);
char *message = "Hello from client";
// 1. Socket তৈরি করা
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 2. সার্ভার ঠিকানা সেটআপ করা
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 3. ডেটা পাঠানো
sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&serv_addr, addr_len);
printf("Message sent to server\n");
// 4. ডেটা গ্রহণ করা
int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&serv_addr, &addr_len);
buffer[n] = '\0';
printf("Server: %s\n", buffer);
// 5. Socket বন্ধ করা
close(sockfd);
return 0;
}
socket()
ফাংশন ব্যবহার করে সার্ভারের জন্য একটি UDP Socket তৈরি করা হয়।bind()
ফাংশন ব্যবহার করে Socket-কে নির্দিষ্ট IP Address এবং পোর্টে সংযুক্ত করা হয় (INADDR_ANY
এবং 8080
)।recvfrom()
ফাংশন ইনকামিং ডেটা গ্রহণ করে এবং তা buffer
এ সংরক্ষণ করে। এটি ক্লায়েন্টের ঠিকানা এবং পোর্ট নম্বরও ধারণ করে।sendto()
ফাংশন ব্যবহার করে ক্লায়েন্টের কাছে একটি বার্তা পাঠানো হয়।close()
ফাংশন Socket বন্ধ করতে ব্যবহার করা হয়।socket()
ফাংশন ব্যবহার করে ক্লায়েন্টের জন্য একটি UDP Socket তৈরি করা হয়।inet_addr()
ফাংশন ব্যবহার করে সার্ভারের IP Address এবং htons()
ফাংশন ব্যবহার করে পোর্ট নম্বর সেট করা হয়।sendto()
ফাংশন ব্যবহার করে সার্ভারে বার্তা পাঠানো হয়।recvfrom()
ফাংশন ব্যবহার করে সার্ভার থেকে ডেটা প্যাকেট গ্রহণ করা হয় এবং তা buffer
এ সংরক্ষণ করা হয়।close()
ফাংশন Socket বন্ধ করতে ব্যবহার করা হয়।প্রথমে সার্ভার প্রোগ্রাম চালু করুন:
8080
) ইনকামিং সংযোগের জন্য অপেক্ষা করবে।এরপর ক্লায়েন্ট প্রোগ্রাম চালু করুন:
ক্লায়েন্ট এবং সার্ভারের মধ্যে বার্তা আদান-প্রদান:
UDP (User Datagram Protocol) একটি connectionless প্রোটোকল, যা ডেটা প্যাকেট বা Datagram সরাসরি প্রেরণ করে। TCP-এর মতো UDP কোনো connection setup প্রক্রিয়া বা error correction মেকানিজম ব্যবহার করে না। তবে, UDP ডাটাগ্রাম হ্যান্ডলিং এবং ত্রুটি সনাক্তকরণের জন্য কিছু নির্দিষ্ট প্রক্রিয়া অনুসরণ করে।
UDP ডাটাগ্রাম হ্যান্ডলিং করার সময় কয়েকটি গুরুত্বপূর্ণ দিক অনুসরণ করে:
Datagram Structure:
Datagram Transmission:
Stateless Handling:
No Flow Control:
UDP ত্রুটি সংশোধন না করলেও, এটি ত্রুটি সনাক্তকরণের জন্য Checksum ব্যবহার করে। এটি নিশ্চিত করে যে ডাটাগ্রামটি সঠিকভাবে ডেলিভার হয়েছে কিনা। ত্রুটি সনাক্তকরণের পদ্ধতি নিচে বিস্তারিতভাবে বর্ণনা করা হলো:
Checksum Field:
Checksum Calculation:
Error Detection and Handling:
একটি সাধারণ UDP সার্ভার- ক্লায়েন্ট প্রোগ্রাম যেখানে UDP ডাটাগ্রাম পাঠানো এবং Checksum-এর মাধ্যমে ত্রুটি চেক করা হয়:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
char *message = "Hello from server";
// Socket তৈরি করা
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// সার্ভার ঠিকানা সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// Binding করা
if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(sockfd);
exit(EXIT_FAILURE);
}
printf("Server is listening on port %d\n", PORT);
// ডেটা গ্রহণ করা
int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&client_addr, &addr_len);
buffer[n] = '\0';
printf("Client: %s\n", buffer);
// ডেটা পাঠানো
sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&client_addr, addr_len);
printf("Hello message sent to client\n");
// Socket বন্ধ করা
close(sockfd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sockfd;
char buffer[1024];
struct sockaddr_in serv_addr;
socklen_t addr_len = sizeof(serv_addr);
char *message = "Hello from client";
// Socket তৈরি করা
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// সার্ভার ঠিকানা সেটআপ করা
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// ডেটা পাঠানো
sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&serv_addr, addr_len);
printf("Message sent to server\n");
// ডেটা গ্রহণ করা
int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&serv_addr, &addr_len);
buffer[n] = '\0';
printf("Server: %s\n", buffer);
// Socket বন্ধ করা
close(sockfd);
return 0;
}
common.read_more